package com.jiangkai.common.shiro.utils;
import java.io.ByteArrayInputStream;  
import java.io.ByteArrayOutputStream;  
import java.io.ObjectInputStream;  
import java.io.ObjectOutputStream;  
import java.io.Serializable;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory; 
/**
 * 序列化
 * @author jiangkia
 *
 */
public class SerializeUtils {
	   
    private static Logger logger = LoggerFactory.getLogger(SerializeUtils.class);  
      
    /** 
     * 反序列化 
     * @param bytes 
     * @return 
     */  
    public static Object deserialize(byte[] bytes) {  
          
        Object result = null;  
          
        if (isEmpty(bytes)) {  
            return null;  
        }  
  
        try {  
            ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);  
            try {  
                ObjectInputStream objectInputStream = new ObjectInputStream(byteStream);  
                try {  
                    result = objectInputStream.readObject();  
                }  
                catch (ClassNotFoundException ex) {  
                    throw new Exception("Failed to deserialize object type", ex);  
                }  
            }  
            catch (Throwable ex) {  
                throw new Exception("Failed to deserialize", ex);  
            }  
        } catch (Exception e) {  
            logger.error("Failed to deserialize",e);  
        }  
        return result;  
    }  
      
    public static boolean isEmpty(byte[] data) {  
        return (data == null || data.length == 0);  
    }  
  
    /** 
     * 序列化 
     * @param object 
     * @return 
     */  
    public static byte[] serialize(Object object) {  
          
        byte[] result = null;  
          
        if (object == null) {  
            return new byte[0];  
        }  
        try {  
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();  
            try  {  
                if (!(object instanceof Serializable)) {  
                    throw new IllegalArgumentException(SerializeUtils.class.getSimpleName() + " requires a Serializable payload " +  
                            "but received an object of type [" + object.getClass().getName() + "]");  
                }  
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteStream);  
                objectOutputStream.writeObject(object);  
                objectOutputStream.flush();  
                result =  byteStream.toByteArray();  
            }  
            catch (Throwable ex) {  
                throw new Exception("Failed to serialize", ex);  
            }  
        } catch (Exception ex) {  
            logger.error("Failed to serialize",ex);  
        }  
        return result;  
    }  
}
